<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>数组的方法-reduce</title>
</head>
<body>
  <script>
    /*
      reduce：汇总（统计一个最终的结果），常用作数组求和
      reduce(回调函数，初始值)
      初始值可有可无，根据有无初始值，回调函数执行的次数
        1. 有初始值，回调函数执行数组的length次
        2. 无初始值，回调函数执行数组的length - 1 次 

      

    */
  //  let nums = [10, 20, 30, 40]

   // 无初始值
  //  nums.reduce((accu, val, index) => {
     /*
      无初始值
        accu：第一次取数组的第一个元素
        val：第一次取数组的第二个元素
        index: val这个元素在数组中的下标
        accu的值从第二次开始起，
          它的值来自于来自上一次回调函数返回的值，
          如果没有返回，它的值就是undefined
     */
    //  console.log(accu, val, index)
  //  })
  
  // let nums = [10, 20, 30, 40]
   // 有初始值
  //  nums.reduce((accu, val, index) => {
     /*
      有初始值
        accu：第一次的值来自给定的初始值
        val：第一次取数组的第一个元素
        index: val这个元素在数组中的下标
        accu的值从第二次开始起，
          它的值来自于来自上一次回调函数返回的值，
          如果没有返回，它的值就是undefined
     */
    //  console.log(accu, val, index)
  //  }, 0)

  // let nums = [10, 20, 30, 40]
  // let r = nums.reduce((accu = 60, val = 40) => accu + val)
  // let r = nums.reduce((accu = 60, val = 40) => accu + val, 0)
  // console.log(r)

  let list = [
    {
      id: 9,
      price: 18.8,
      count: 2,
      name: '乒乓球拍'
    },{
      id: 20,
      price: 168,
      count: 1,
      name: '篮球'
    },{
      id: 6,
      price: 99,
      count: 3,
      name: '足球'
    },{
      id: 17,
      price: 138,
      count: 4,
      name: '羽毛球'
    }
  ]
  let r = list.reduce((accu, obj) => {
    return accu + obj.price * obj.count
  }, 0)
  /*
    结论：数字数组求和不用给初始值，对象求和就需要给初始值零
  */
  console.log(r)
  </script>
</body>
</html>